DOM的事件模型是什么
    // DOM之事件模型分脚本模型、内联模型(同类一个，后者覆盖)、动态绑定(同类多个)
    // <!--行内绑定：脚本模型-->
    // <button onclick="javascrpt:alert('Hello')">Hello1</button>
    // <!--内联模型-->
    // <button onclick="showHello()">Hello2</button>
    // <!--动态绑定-->
    // <button id="btn3">Hello3</button>
事件委托
    // 事件委托就是利用事件冒泡，只指定一个事件处理程序，就可以管理某一类型的所有事件.
    // 在绑定大量事件的时候往往选择事件委托。
    // 节省内存占用，减少事件注册,  新增子对象时无需再次对其绑定事件，适合动态添加元素
    // event.currentTarget指向事件所绑定的元素，而event.target始终指向事件发生时的元素
当你在浏览器地址栏输入一个URL后回车，将会发生的事情
//   1.浏览器的url请求
//   2.查找DNS服务器，根据域名查找对应的ip地址
//   3.连接目标服务器建立tcp的连接
//   4.向目标服务器发送http请求
//   5.web服务器收到请求后进行处理，并返回相应的结果
//   6.浏览器接受到返回的内容
//   7.浏览器开始解析html文件，自上而下，先是头部，后是body
//   8.当解析到外链的时候同步去下载，比如css的外链
//   9.解析body部分，生成dom树，同时css文件在下载，下载成功后，同步已经生成的dom节点，将两者结合计算生成dom树
//   10.计算完渲染的坐标，宽高等后，进行同步渲染。如果遇到图片这些，则跳到下面的去渲染，等待图片下载成功后，再渲染原来的图片为证
//   11.如果遇到js代码调整dom树的情况，也会重新渲染从修改的地方开始
//   12.渲染完毕后，开始执行onload时间
//   整个过程会有很多请求，并且每一个用完都会自己关了，除非是keep-live类型的可以请求多次才关闭。
渲染机制
什么是DOCTYPE以及作用
//  声明文档类型，告诉浏览器他是什么文档类型，应该以何种协议引擎来解析和渲染
//  html5 <!DOCTYPE html>
重排 Reflow
//  dom中各个元素都有自己的盒子，这些都是浏览器根据样式计算，将计算结果对应展示出来的过程
// 与repaint区别就是他会影响到dom的结构渲染，同时他会触发repaint，他会改变他本身与所有父辈元素(祖先)，这种开销是非常昂贵的，影响性能
//  当动态增加、删除、修改节点的时候，会导致Reflow或Repaint
//  移动dom的时候
//  当修改css样式
//  修改默认字体的时候
//  读取元素的某些属性offsetLeft、offsetTop、offsetHeight、offsetWidth、scrollTop/Left/Width/Height、clientTop/Left/Width/Height、getComputedStyle()、currentStyle(in IE))
 重绘repaint
//  页面要呈现的内容绘制了一遍就叫repain
//  触发repain DOM改动 css改动，判断页面呈现的内容有没有发生变化，有变化了就会导致repain.元素的外观被改变，且在没有改变布局的情况下发生，不会影响到dom结构渲染
如何优化你的脚本来减少reflow/repaint?
//  4.1减少对document上的dom操作，如果需要添加多个节点的时候可以使用DocumentFragment创建后一次性添加document
//  4.2尽可能减少修改元素style上的属性，尽量通过className来修改样式，通过cssText属性来设置样式值
//  4.3缓存Layout属性值，对于一些非引用类型的值可以存储到局部变量中
//  4.4设置元素的position为absolute或fixed 可以使元素从DOM树结构中脱离出来独立的存在，而浏览器在需要渲染时只需要渲染该元素以及位于该元素下方的元素
前端实现即时通讯
// 1.短轮询
// 2.comet有两种主要实现⼿段，⼀种是基于 AJAX 的⻓轮询（long-polling）⽅式，另⼀种是基于 Iframe 及 htmlfile 的流 （streaming）⽅式，通常被叫做⻓连接。
// 3.SSE 服务端推送
// 4.Websocket
git
// marge 特点：⾃动创建⼀个新的commit 如果合并的时候遇到冲突，仅需要修改后重新commit 
// 优点：记录了真实的commit情况，包括每个分⽀的详情 
// 缺点：因为每次merge会⾃动产⽣⼀个merge commit，所以在使⽤⼀些git 的GUI tools，特别是commit⽐较频繁 时，看到分⽀很杂乱。
// rebase 特点：会合并之前的commit历史 
// 优点：得到更简洁的项⽬历史，去掉了merge commit 
// 缺点：如果合并出现代码问题不容易定位，因为re-write了history 
// 因此,当需要保留详细的合并信息的时候建议使⽤git merge，特别是需要将分⽀合并进⼊master分⽀时；
// 当发现⾃⼰修 改某个功能时，频繁进⾏了git commit提交时，发现其实过多的提交信息没有必要时，可以尝试git rebase.